import shop from '../../api/shop'

const state = {
  items: [], // 当前购物车
  checkoutStatus: null // 结算状态
}

const getters = {
  // 获取添加到购物车中的数据
  getCartProducts: (state, getters, rootState) => {
    return state.items.map(({ id, quantity }) => {
      const product = rootState.products.all.find(product => product.id === id)
      return {
        title: product.title,
        price: product.price,
        quantity
      }
    })
  },
  // 计算总价格
  getTotalPrice: (state, getters) => {
    return getters.getCartProducts.reduce((total, product) => {
      return total + product.price * product.quantity
    }, 0)
  }
}

const actions = {
  addToCart ({ state, commit }, product) {
    // 先判断库存
    if (product.inventory > 0) {
      // 在判断是否已经加入购物车
      const cartItem = state.items.find(item => item.id === product.id)
      if (cartItem) {
        // 如果存在，则添加数量
        commit('incrementItemQuantity', cartItem)
      } else {
        // 不存在则加入购物车
        commit('pushProductToCart', { id: product.id })
      }
      // 加入成功后 减少库存
      commit('products/decrementProductInventory', { id: product.id }, { root: true })
    }
  },
  // 结算流程
  checkoutProducts ({ state, commit }, products) {
    // 发起结算请求，如果结算成功，清空购物车，失败则返回到购物车
    // 清除结算状态
    commit('setCheckoutStatus', null)
    // 暂存一份购物车数据
    const cartList = [...state.items]
    // 清空购物车
    commit('setCartItems', { items: [] })
    // 发起结算请求
    shop.buyProducts(products,
      // 结算成功
      () => commit('setCheckoutStatus', 'success'),
      // 结算失败
      () => {
        commit('setCheckoutStatus', 'fail')
        // 恢复购物车数据
        commit('setCartItems', { items: cartList })
      })
  }
}

const mutations = {
  // 增加数量
  incrementItemQuantity (state, { id }) {
    const cartItem = state.items.find(item => item.id === id)
    cartItem.quantity++
  },
  // 加入购物车
  pushProductToCart (state, { id }) {
    state.items.push({
      id: id,
      quantity: 1
    })
  },
  // 设置结算状态
  setCheckoutStatus (state, status) {
    state.checkoutStatus = status
  },
  // 设置购物车数据
  setCartItems (state, { items }) {
    state.items = items
  }
}

export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations
}
